/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO.MySQL;

import ClassesUnicas.LinhaMatrizConfusao;
import DAO.DAOMatrizConfusao;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

/**
 * DAOMatrizConfusaoMySQL
 *
 * Versao 1.0
 *
 * Data Criação 30/05/2014
 *
 * @author Igor
 */
public class DAOMatrizConfusaoMySQL extends DAOConexaoMySQL implements DAOMatrizConfusao {

    @Override
    public ArrayList<LinhaMatrizConfusao> matrizConfusaoExpressoes(int tipoBusca, String idJogador, String periodoInicial, String periodoFinal, String idFase, String idSubFase, Boolean somenteBaseline, String idInstanciaJogo) throws Exception {
        ResultSet result = null;
        ArrayList<LinhaMatrizConfusao> linhasMatrizConfusao = new ArrayList<LinhaMatrizConfusao>();

        String sqlWhere = "";

        //idJogador
        if (idJogador != null) {
            if (sqlWhere.isEmpty()) {
                sqlWhere = " where ";
            } else {
                sqlWhere = sqlWhere + " and ";
            }
            sqlWhere = sqlWhere + " e.id_pessoa = " + idJogador + "\n";
        }

        //idFase
        if (idFase != null) {
            if (sqlWhere.isEmpty()) {
                sqlWhere = " where ";
            } else {
                sqlWhere = sqlWhere + " and ";
            }
            sqlWhere = sqlWhere + " b.id_fase = " + idFase + "\n";
        }

        //idSubFase
        if (idSubFase != null) {
            if (sqlWhere.isEmpty()) {
                sqlWhere = " where ";
            } else {
                sqlWhere = sqlWhere + " and ";
            }
            sqlWhere = sqlWhere + " b.id_sub_fase = " + idSubFase + "\n";
        }

        if (somenteBaseline) {
            if (sqlWhere.isEmpty()) {
                sqlWhere = " where ";
            } else {
                sqlWhere = sqlWhere + " and ";
            }
            sqlWhere = sqlWhere + " c.id_instancia_jogo = (\n"
                    + " select aaa.id_instancia_jogo from\n"
                    + " instancia_jogo aaa\n"
                    + " left outer join jogo bbb\n"
                    + " on aaa.id_instancia_jogo = bbb.id_instancia_jogo\n"
                    + " where bbb.id_pessoa = e.id_pessoa\n"
                    + " and aaa.id_fase = c.id_fase\n"
                    + " and aaa.tempo_jogo > 0\n"
                    + " order by aaa.data_inicio\n"
                    + " limit 1\n"
                    + " )";
        } else {
            //Periodo Inicial
            if (periodoInicial != null) {
                try {
                    java.util.Date DataNascFr = new SimpleDateFormat("dd/MM/yyyy").parse(periodoInicial);
                    periodoInicial = new SimpleDateFormat("yyyy-MM-dd").format(DataNascFr);
                } catch (java.text.ParseException e) {
                    e.printStackTrace();
                }
                if (sqlWhere.isEmpty()) {
                    sqlWhere = " where ";
                } else {
                    sqlWhere = sqlWhere + " and ";
                }
                sqlWhere = sqlWhere + " c.data_inicio >= '" + periodoInicial + " 00:00:00'\n";//Tive que adicionar o horario para o MySQL funcionar
            }

            //Periodo Final
            if (periodoFinal != null) {
                try {
                    java.util.Date DataNascFr = new SimpleDateFormat("dd/MM/yyyy").parse(periodoFinal);
                    periodoFinal = new SimpleDateFormat("yyyy-MM-dd").format(DataNascFr);
                } catch (java.text.ParseException e) {
                    e.printStackTrace();
                }
                if (sqlWhere.isEmpty()) {
                    sqlWhere = " where ";
                } else {
                    sqlWhere = sqlWhere + " and ";
                }
                sqlWhere = sqlWhere + " c.data_inicio <= '" + periodoFinal + " 23:59:59'\n"; //Tive que adicionar o horario para o MySQL funcionar
            }
        }

        //idInsatnciaJogo
        if (idInstanciaJogo != null) {
            if (sqlWhere.isEmpty()) {
                sqlWhere = " where ";
            } else {
                sqlWhere = sqlWhere + " and ";
            }
            sqlWhere = sqlWhere + " c.ID_INSTANCIA_JOGO = " + idInstanciaJogo + "\n";
        }

        String sqlSelectExterno = null;
        String sqlGroupByExterno = null;
        String sqlUnionAll = "";
        if (tipoBusca == 1) {
            sqlSelectExterno = "select aa.descricao,\n";
            sqlGroupByExterno = "group by alyas1.id_expressao;";
            sqlUnionAll =  "union all\n"
                + "select '1' as ID_ROSTO,\n"
                + "a2.ID_EXPRESSAO,\n"
                + "'0' as INTENSIDADE,\n"
                + "null as ID_EXPRESSAO_RESPOSTA,\n"
                + "'0' as EXPRESSAO0,\n"
                + "'0' as TEMPO0,\n"
                + "'0' as EXPRESSAO1,\n"
                + "'0' as TEMPO1,\n"
                + "'0' as EXPRESSAO2,\n"
                + "'0' as TEMPO2,\n"
                + "'0' as EXPRESSAO3,\n"
                + "'0' as TEMPO3,\n"
                + "'0' as EXPRESSAO4,\n"
                + "'0' as TEMPO4,\n"
                + "'0' as EXPRESSAO5,\n"
                + "'0' as TEMPO5,\n"
                + "'0' as EXPRESSAO6,\n"
                + "'0' as TEMPO6,\n"
                + "'0' as EXPRESSAO7\n"
                + "from expressao a2\n";
        } else {
            sqlSelectExterno = "select concat(if(bb.SEXO='F', \"Mulher\", \"Homem\"),\" \",bb.ETNIA,\" \", lpad(alyas1.INTENSIDADE,3,'0'), \"\",  \" \", aa.DESCRICAO) as descricao,\n";//"select concat(lpad(INTENSIDADE,3,'0'),ID_ROSTO) as descricao,\n";
            sqlGroupByExterno = "group by alyas1.id_rosto, alyas1.id_expressao, alyas1.intensidade;";
        }

        String sql = sqlSelectExterno
                + "sum(expressao0) as 'neutro',\n"
                + "sum(tempo0)/sum(expressao0) as 'tempo0',\n"
                + "sum(expressao1) as 'alegria',\n"
                + "sum(tempo1)/sum(expressao1) as 'tempo1',\n"
                + "sum(expressao2) as 'medo',\n"
                + "sum(tempo2)/sum(expressao2) as 'tempo2',\n"
                + "sum(expressao3) as 'nojo',\n"
                + "sum(tempo3)/sum(expressao3) as 'tempo3',\n"
                + "sum(expressao4) as 'raiva',\n"
                + "sum(tempo4)/sum(expressao4) as 'tempo4',\n"
                + "sum(expressao5) as 'surpresa',\n"
                + "sum(tempo5)/sum(expressao5) as 'tempo5',\n"
                + "sum(expressao6) as 'triste',\n"
                + "sum(tempo6)/sum(expressao6) as 'tempo6',\n"
                + "sum(expressao7) as 'nulo'\n"
                + ",sum(expressao0+expressao1+expressao2+expressao3+expressao4+expressao5+expressao6+expressao7) as total\n"
                + "from(\n"
                + "select a.id_rosto, a.id_expressao, a.intensidade, a.id_expressao_resposta,\n"
                + "if(a.id_expressao_resposta=0, 1,0) as 'expressao0',\n"
                + "if(a.id_expressao_resposta=0, a.tempo_resposta,0) as 'tempo0',\n"
                + "if(a.id_expressao_resposta=1, 1,0) as 'expressao1',\n"
                + "if(a.id_expressao_resposta=1, a.tempo_resposta,0) as 'tempo1',\n"
                + "if(a.id_expressao_resposta=2, 1,0) as 'expressao2',\n"
                + "if(a.id_expressao_resposta=2, a.tempo_resposta,0) as 'tempo2',\n"
                + "if(a.id_expressao_resposta=3, 1,0) as 'expressao3',\n"
                + "if(a.id_expressao_resposta=3, a.tempo_resposta,0) as 'tempo3',\n"
                + "if(a.id_expressao_resposta=4, 1,0) as 'expressao4',\n"
                + "if(a.id_expressao_resposta=4, a.tempo_resposta,0) as 'tempo4',\n"
                + "if(a.id_expressao_resposta=5, 1,0) as 'expressao5',\n"
                + "if(a.id_expressao_resposta=5, a.tempo_resposta,0) as 'tempo5',\n"
                + "if(a.id_expressao_resposta=6, 1,0) as 'expressao6',\n"
                + "if(a.id_expressao_resposta=6, a.tempo_resposta,0) as 'tempo6',\n"
                + "if(ifnull(a.id_expressao_resposta,-1)=-1, 1,0) as 'expressao7'\n"
                + "from imagem_sub_fase a\n"
                + "left outer join instancia_sub_fase b\n"
                + "on a.id_instancia_sub_fase = b.id_instancia_sub_fase\n"
                + "left outer join instancia_jogo c\n"
                + "on b.id_instancia_jogo = c.id_instancia_jogo\n"
                + "left outer join jogo d\n"
                + "on d.id_instancia_jogo = c.id_instancia_jogo\n"
                + "left outer join pessoa e\n"
                + "on e.id_pessoa = d.id_pessoa\n"
                + sqlWhere
                + sqlUnionAll
                + ") as alyas1\n"
                + "left outer join expressao aa\n"
                + "on aa.id_expressao = alyas1.id_expressao\n"
                + "left outer join rosto bb\n"
                + "on bb.id_rosto = alyas1.id_rosto\n"
                + sqlGroupByExterno;

        result = this.select.executeQuery(sql);

        while (result.next()) {
            LinhaMatrizConfusao linhaMatrizConfusao = new LinhaMatrizConfusao();

            linhaMatrizConfusao.setDescricao(result.getString("descricao"));
            linhaMatrizConfusao.setAvaliacaoNeutro(result.getInt("neutro"));
            linhaMatrizConfusao.setTempoRespostaNeutro(result.getInt("tempo0"));
            linhaMatrizConfusao.setAvaliacaoAlegria(result.getInt("alegria"));
            linhaMatrizConfusao.setTempoRespostaAlegria(result.getInt("tempo1"));
            linhaMatrizConfusao.setAvaliacaoMedo(result.getInt("medo"));
            linhaMatrizConfusao.setTempoRespostaMedo(result.getInt("tempo2"));
            linhaMatrizConfusao.setAvaliacaoNojo(result.getInt("nojo"));
            linhaMatrizConfusao.setTempoRespostaNojo(result.getInt("tempo3"));
            linhaMatrizConfusao.setAvaliacaoRaiva(result.getInt("raiva"));
            linhaMatrizConfusao.setTempoRespostaRaiva(result.getInt("tempo4"));
            linhaMatrizConfusao.setAvaliacaoSurpresa(result.getInt("surpresa"));
            linhaMatrizConfusao.setTempoRespostaSurpresa(result.getInt("tempo5"));
            linhaMatrizConfusao.setAvaliacaoTriste(result.getInt("triste"));
            linhaMatrizConfusao.setTempoRespostaTriste(result.getInt("tempo6"));
            linhaMatrizConfusao.setAvaliacaoNulo(result.getInt("nulo"));
            linhaMatrizConfusao.setTotal(result.getInt("total"));

            linhasMatrizConfusao.add(linhaMatrizConfusao);
        }

        return linhasMatrizConfusao;
    }
}
